package com.zenithmind.mall.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.entity.UserCoupon;
import com.zenithmind.mall.pojo.query.UserCouponQuery;
import com.zenithmind.mall.pojo.vo.UserCouponVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 用户优惠券服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-06-09
 */
public interface UserCouponService extends IService<UserCoupon> {

    /**
     * 分页查询用户优惠券
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<UserCouponVO> getUserCouponPage(UserCouponQuery query);

    /**
     * 根据ID获取用户优惠券详情
     * 
     * @param id 用户优惠券ID
     * @param userId 用户ID
     * @return 用户优惠券详情
     */
    UserCouponVO getUserCouponById(String id, String userId);

    /**
     * 获取用户优惠券列表
     * 
     * @param userId 用户ID
     * @param status 状态（0-未使用，1-已使用，2-已过期）
     * @return 用户优惠券列表
     */
    List<UserCouponVO> getUserCouponList(String userId, Integer status);

    /**
     * 获取用户可用优惠券
     * 
     * @param userId 用户ID
     * @param orderAmount 订单金额
     * @return 可用优惠券列表
     */
    List<UserCouponVO> getAvailableUserCoupons(String userId, BigDecimal orderAmount);

    /**
     * 使用优惠券
     * 
     * @param id 用户优惠券ID
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean useUserCoupon(String id, String orderId, String userId);

    /**
     * 退还优惠券
     * 
     * @param id 用户优惠券ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean returnUserCoupon(String id, String userId);

    /**
     * 检查优惠券是否可用
     * 
     * @param id 用户优惠券ID
     * @param userId 用户ID
     * @param orderAmount 订单金额
     * @return 是否可用
     */
    Boolean checkUserCouponAvailable(String id, String userId, BigDecimal orderAmount);

    /**
     * 计算优惠金额
     * 
     * @param id 用户优惠券ID
     * @param userId 用户ID
     * @param orderAmount 订单金额
     * @return 优惠金额
     */
    BigDecimal calculateDiscountAmount(String id, String userId, BigDecimal orderAmount);

    /**
     * 获取用户优惠券统计
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    UserCouponStatistics getUserCouponStatistics(String userId);

    /**
     * 过期用户优惠券
     * 
     * @return 过期数量
     */
    Integer expireUserCoupons();

    /**
     * 删除用户优惠券
     * 
     * @param id 用户优惠券ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean deleteUserCoupon(String id, String userId);

    /**
     * 批量删除用户优惠券
     * 
     * @param ids 用户优惠券ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean deleteUserCouponsBatch(List<String> ids, String userId);

    /**
     * 用户优惠券统计类
     */
    class UserCouponStatistics {
        private Long totalCount;
        private Long availableCount;
        private Long usedCount;
        private Long expiredCount;

        public UserCouponStatistics(Long totalCount, Long availableCount, Long usedCount, Long expiredCount) {
            this.totalCount = totalCount;
            this.availableCount = availableCount;
            this.usedCount = usedCount;
            this.expiredCount = expiredCount;
        }

        // getters and setters
        public Long getTotalCount() { return totalCount; }
        public void setTotalCount(Long totalCount) { this.totalCount = totalCount; }

        public Long getAvailableCount() { return availableCount; }
        public void setAvailableCount(Long availableCount) { this.availableCount = availableCount; }

        public Long getUsedCount() { return usedCount; }
        public void setUsedCount(Long usedCount) { this.usedCount = usedCount; }

        public Long getExpiredCount() { return expiredCount; }
        public void setExpiredCount(Long expiredCount) { this.expiredCount = expiredCount; }
    }
}
